package vip.xiaonuo.modular.databaseinfo.service.impl;

import vip.xiaonuo.modular.databaseinfo.service.DatabaseInfoService;

import java.sql.SQLException;
import java.util.Collections;
import java.util.List;

public abstract class AbstractTableInfoUtil implements DatabaseInfoService {
    // 一个对象，它包括了 jdbc url、jdbc driver class、username、password
    protected final BiDataSource dataSource;

    public AbstractTableInfoUtil(final BiDataSource dataSource) {
        this.dataSource = dataSource;
    }

    // 一个枚举类，用来记录当前是哪个类型的数据库
    protected abstract SourceType getSourceType();

    // 获取有权限访问的 表 的总数
    public int getTableCount() throws SQLException {
        int tableCount = 0;
        if (dataSource != null) {
            try {
                Class.forName(dataSource.datasourceType.className);
            } catch (ClassNotFoundException e) {
//                play.Logger.error(e.getMessage(), e);
            }

            // 具体由子类实现
            tableCount = getTableCount(dataSource);
        }

        return tableCount;
    }

    // 由子类实现 获取表的总数
    protected abstract int getTableCount(final BiDataSource dataSource);

    // 根据分页参数，获取指定的 表的集合
    public List getTableInfoList(final int pageSize, final int pageNumber){
        List tableInfoList = Collections.emptyList();
        if (dataSource != null) {
            try {
                if(dataSource.url.contains("oracle")){
                    Class.forName(dataSource.datasourceType.className).newInstance();
                }else{
                    Class.forName(dataSource.datasourceType.className);
                }
            } catch (Exception e) {
                System.err.println("[ERROR] e"+ e.toString());
            }

            // 具体由子类实现
            tableInfoList = getTableInfoList(dataSource, pageSize, pageNumber);
        }
        return tableInfoList;
    }

    // 由子类实现 获取指定数量的 表的集合
    protected abstract List getTableInfoList(final BiDataSource dataSource, final int pageSize, final int pageNumber);

    // 获取指定的表的所有字段
    public List getTableFields(final String schemaName, final String tableName) throws SQLException {
        List list = Collections.emptyList();
        if (dataSource != null) {
            try{
                BiDataSource biDataSource =new BiDataSource();
                  Class.forName(biDataSource.datasourceType.className);
            }catch (Exception e) {
                System.out.println("e"+e.toString());
            }

            // 具体由子类实现
            list = getTableFields(dataSource, schemaName, tableName);
        }
        return list;
    }

    // 由子类实现 获取指定表的所有字段
    protected abstract List getTableFields(final BiDataSource dataSource, final String schemaName, final String tableName);
}
